#!/bin/bash

# Enhanced Tinker patch build script
# 增强版 Tinker 补丁构建脚本
# 
# 功能:
# 1. 构建基准 APK
# 2. 构建补丁版本 APK
# 3. 自动重命名 APK 文件
# 4. 生成 Tinker 补丁文件
# 5. 验证补丁文件

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
APK_OUTPUT_DIR="app/build/outputs/apk/release"
PATCH_OUTPUT_DIR="app/build/outputs/tinkerPatch"
VERSIONS_DIR="apk_versions"
BASE_VERSION="1.0.0"
PATCH_VERSION="1.1.0"

# 显示帮助信息
show_help() {
    echo -e "${BLUE}Tinker 补丁构建脚本使用说明${NC}"
    echo ""
    echo "用法:"
    echo "  $0 [选项]"
    echo ""
    echo "选项:"
    echo "  build-base              构建基准版本 APK"
    echo "  build-patch             构建补丁版本 APK"
    echo "  generate-patch          生成补丁文件 (需要基准和补丁 APK)"
    echo "  full-process            执行完整流程 (构建基准->构建补丁->生成补丁)"
    echo "  clean                   清理构建文件"
    echo "  help, -h, --help        显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 build-base           # 只构建基准版本"
    echo "  $0 build-patch          # 只构建补丁版本"
    echo "  $0 generate-patch       # 生成补丁文件"
    echo "  $0 full-process         # 执行完整流程"
    echo ""
}

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查文件是否存在
check_file_exists() {
    if [ ! -f "$1" ]; then
        log_error "文件不存在: $1"
        return 1
    fi
    return 0
}

# 创建目录
create_directory() {
    if [ ! -d "$1" ]; then
        mkdir -p "$1"
        log_info "创建目录: $1"
    fi
}

# 设置 Tinker ID
set_tinker_id() {
    local tinker_id=$1
    log_info "设置 Tinker ID: $tinker_id"
    
    # 更新 build.gradle 中的 tinkerId
    sed -i.bak "s/tinkerId = \".*\"/tinkerId = \"$tinker_id\"/" app/build.gradle
    
    if [ $? -eq 0 ]; then
        log_success "Tinker ID 更新成功"
    else
        log_error "Tinker ID 更新失败"
        return 1
    fi
}

# 构建 APK
build_apk() {
    local build_type=$1
    log_info "开始构建 $build_type APK..."
    
    ./gradlew clean assembleRelease
    
    if [ $? -eq 0 ]; then
        log_success "$build_type APK 构建成功"
        return 0
    else
        log_error "$build_type APK 构建失败"
        return 1
    fi
}

# 重命名并复制 APK
rename_and_copy_apk() {
    local version=$1
    local target_name=$2
    
    create_directory "$VERSIONS_DIR"
    
    local source_apk="$APK_OUTPUT_DIR/app-release-unsigned.apk"
    local target_apk="$VERSIONS_DIR/$target_name"
    
    if check_file_exists "$source_apk"; then
        cp "$source_apk" "$target_apk"
        log_success "APK 已复制并重命名: $target_apk"
        return 0
    else
        log_error "源 APK 文件不存在: $source_apk"
        return 1
    fi
}

# 构建基准版本
build_base_version() {
    log_info "=== 构建基准版本 APK ==="
    
    # 设置基准版本的 Tinker ID
    set_tinker_id "base-$BASE_VERSION" || return 1
    
    # 构建 APK
    build_apk "基准版本" || return 1
    
    # 重命名并保存
    rename_and_copy_apk "$BASE_VERSION" "app-base-v$BASE_VERSION.apk" || return 1
    
    log_success "基准版本构建完成"
}

# 构建补丁版本
build_patch_version() {
    log_info "=== 构建补丁版本 APK ==="
    
    # 检查是否存在基准版本
    local base_apk="$VERSIONS_DIR/app-base-v$BASE_VERSION.apk"
    if ! check_file_exists "$base_apk"; then
        log_warning "基准版本不存在，将先构建基准版本"
        build_base_version || return 1
    fi
    
    # 这里可以添加代码修改逻辑
    log_info "请确保已经修改了需要打补丁的代码"
    
    # 设置补丁版本的 Tinker ID
    set_tinker_id "patch-$PATCH_VERSION" || return 1
    
    # 构建 APK
    build_apk "补丁版本" || return 1
    
    # 重命名并保存
    rename_and_copy_apk "$PATCH_VERSION" "app-patch-v$PATCH_VERSION.apk" || return 1
    
    log_success "补丁版本构建完成"
}

# 生成补丁文件
generate_patch() {
    log_info "=== 生成 Tinker 补丁文件 ==="
    
    local base_apk="$VERSIONS_DIR/app-base-v$BASE_VERSION.apk"
    local patch_apk="$VERSIONS_DIR/app-patch-v$PATCH_VERSION.apk"
    
    # 检查必需的 APK 文件
    check_file_exists "$base_apk" || return 1
    check_file_exists "$patch_apk" || return 1
    
    log_info "基准 APK: $base_apk"
    log_info "补丁 APK: $patch_apk"
    
    # 生成补丁
    ./gradlew tinkerPatchRelease -Ptinker.oldApk="$base_apk" -Ptinker.newApk="$patch_apk"
    
    if [ $? -eq 0 ]; then
        log_success "补丁文件生成成功"
        
        # 显示补丁文件位置
        if [ -d "$PATCH_OUTPUT_DIR" ]; then
            log_info "补丁文件位置: $PATCH_OUTPUT_DIR"
            find "$PATCH_OUTPUT_DIR" -name "*.apk" -o -name "*.patch" | head -5
        fi
        
        return 0
    else
        log_error "补丁文件生成失败"
        return 1
    fi
}

# 清理构建文件
clean_build() {
    log_info "=== 清理构建文件 ==="
    
    ./gradlew clean
    
    if [ -d "$VERSIONS_DIR" ]; then
        log_info "清理版本文件目录: $VERSIONS_DIR"
        rm -rf "$VERSIONS_DIR"
    fi
    
    if [ -d "$PATCH_OUTPUT_DIR" ]; then
        log_info "清理补丁输出目录: $PATCH_OUTPUT_DIR"
        rm -rf "$PATCH_OUTPUT_DIR"
    fi
    
    log_success "清理完成"
}

# 执行完整流程
full_process() {
    log_info "=== 执行完整 Tinker 补丁流程 ==="
    
    # 1. 构建基准版本
    build_base_version || return 1
    
    echo ""
    log_warning "请修改代码以创建补丁版本，然后按 Enter 继续..."
    read -r
    
    # 2. 构建补丁版本
    build_patch_version || return 1
    
    # 3. 生成补丁
    generate_patch || return 1
    
    log_success "完整流程执行完成！"
}

# 主函数
main() {
    case "$1" in
        "build-base")
            build_base_version
            ;;
        "build-patch")
            build_patch_version
            ;;
        "generate-patch")
            generate_patch
            ;;
        "full-process")
            full_process
            ;;
        "clean")
            clean_build
            ;;
        "help"|"-h"|"--help"|"")
            show_help
            ;;
        *)
            log_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"